<?php

/**
 * Die Klasse User representiert einen User.
 * 
 * Die Klasse dient als Container aller Userspezifischen Daten um
 * diese transportieren und verwalten zu können.
 * 
 * @author Shane
 *
 */
class User {
	
	// Die ID
	private $ID;
	// Der Username
	private $Username;
	// Die Email Adrese
	private $Email;
	// Das gehashte Passwort
	private $Password; // gehasht
	
	/**
	 * Konstruktor der Klasse User
	 * Man kann bis zu 4 Argumente übergeben. je nach anzahl wird einer der folgenden
	 * 4 Konstruktoren aufgerufen.
	 * 
	 * @example (), ($username), ($username, $email), ($id, $username, $email), ($id, $username, $email, $password)
	 */
	function __construct() {
		// Argumente auslesen
		$args = func_get_args();
		// Die Anzahl der Argumente feststellen
		$num_args = count($args); 
		// Wenn die Anzahl zwischen 0 und 5 liegt, dann einen 
		// der Konstruktoren mit den Parametern aufrufen
		if ($num_args > 0 and $num_args < 5) {
			
			// debug
			if (DEBUG_ENABLED)
				DebugQuery::getInstance()->append("Calling: %s\n", '__construct_'.$num_args.'('.implode(",", $args) .')');
				
			call_user_func_array(array($this, '__construct_'.$num_args), $args);
		}
	}
	
	/**
	 * Konstruktor der Klasse User mit 1 Argument
	 * 
	 * @param string $username
	 */
	function __construct_1($username) {
		$this->Username = $username;
	}
	
	/**
	 * Kontruktor der Klasse User mit 2 Argumenten
	 * 
	 * @param string $username
	 * @param string $email
	 */
	function __construct_2($username, $email) {
		$this->Username = $username;
		$this->Email	= $email;
	}
	
	/**
	 * Konstruktor der Klasse User mit 3 Argumenten
	 * 
	 * @param integer $id
	 * @param string $username
	 * @param string $email
	 */
	function __construct_3($id, $username, $email) {
		$this->ID 		= $id;
		$this->Username = $username;
		$this->Email	= $email;
	}
	
	/**
	 * Konstruktor mit 4 Argumenten
	 * 
	 * @param integer $id
	 * @param string $username
	 * @param string $email
	 * @param string $password
	 */
	function __construct_4($id, $username, $email, $password) {
		$this->ID 		= $id;
		$this->Username = $username;
		$this->Email	= $email;
		
		// Passwort hashen
		$hash = md5(md5($this->Username).$password);
		$this->Password = $hash;
	}
	
	/**
	 * Gibt die ID zurück
	 */
	public function get_id() {
		return $this->ID;
	}
	
	/**
	 * Gibt den Username zurück
	 */
	public function get_username() {
		return $this->Username;
	}
	
	/**
	 * Gibt die Email zurück
	 */
	public function get_email() {
		return $this->Email;
	}
	
	/**
	 * Gibt das gehashte Passwort zurück
	 */
	public function get_password() {
		return $this->Password;
	}
	
	/**
	 * Setzt die id
	 * 
	 * @param unknown_type $id
	 */
	public function set_id($id) {
		$this->ID = $id;
	}
	
	/**
	 * Setzt den Username
	 * 
	 * @param unknown_type $username
	 */
	public function set_username($username) {
		$this->Username = $username;
	}
	
	/**
	 * Setzt die Email
	 * 
	 * @param unknown_type $email
	 */
	public function set_email($email) {
		$this->Email = $email;
	}
	
	/**
	 * Hasht und setzt das Passwort
	 * 
	 * @param unknown_type $password
	 */
	public function set_password($password) {
		$hash = md5(md5($this->Username).$password);
		$this->Password = $hash;
	}
	
	/**
	 * Destruktor der Klasse User
	 */
	function __destruct() {
		if (DEBUG_ENABLED)
			DebugQuery::getInstance()->append("Destroying User object with id: %d\n", $this->ID);
	}
}

?>